/**
 * @author Laboratio Av I
 * @since 18/04/2012 14:03:56
 */
package ar.edu.utn.frgp.banco.dao.impl;

import java.sql.Connection;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;





import ar.edu.utn.frgp.banco.dao.MovimientosDao;

import ar.edu.utn.frgp.banco.dao.connection.ConnectionHandler;
import ar.edu.utn.frgp.banco.dao.connection.IConnectionHandler;



import ar.edu.utn.frgp.banco.domain.Movimientos;

import ar.edu.utn.frgp.banco.exceptions.DataAccessException;


public class MovimientosDaoImpl implements MovimientosDao {
	
	public void altaMovimiento(Movimientos movimiento) throws DataAccessException {

		PreparedStatement ps = null;
		
		IConnectionHandler handler = new ConnectionHandler();
		Connection cn = handler.getConnection();
		
		try {
			
			java.util.Date utilDate = new java.util.Date();
			
			java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());

							
			ps = cn.prepareStatement("INSERT INTO movimientos VALUES(?,?,?,?,?,?,?)");
			
			ps.setInt   (1, movimiento.getIdmovimiento());
			ps.setInt   (2, movimiento.getNrocuenta());
			ps.setDate  (3, sqlDate);
			ps.setInt   (4, movimiento.getTipomovimiento());
			ps.setInt   (5, movimiento.getOrigen());
			ps.setDouble (6, movimiento.getSaldoactual());
			ps.setDouble (7, movimiento.getMontomovimiento());
			
			
			ps.executeUpdate();
			
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(ps, cn);
		}

	}
	
	public List<Movimientos> traerTodosLosMovimientos() throws DataAccessException {
		  Statement st = null;
	      ResultSet rs = null;
			
			IConnectionHandler handler = new ConnectionHandler();
			Connection cn = handler.getConnection();
			
			List<Movimientos> movimientos = new ArrayList<Movimientos>();
			
			try {
				st = cn.createStatement();
				rs = st.executeQuery("SELECT * FROM movimientos");
				
				Movimientos regMovimiento = null;
				
				while (rs.next()) {
					
					regMovimiento = new Movimientos();
					
					regMovimiento.setIdmovimiento(rs.getInt("idmovimiento"));
					regMovimiento.setNrocuenta(rs.getInt("nrocuenta"));
					regMovimiento.setFecha(rs.getDate("fecha"));
					regMovimiento.setTipomovimiento(rs.getInt("tipomovimiento"));
					regMovimiento.setOrigen(rs.getInt("origen"));
					regMovimiento.setSaldoactual(rs.getDouble("saldoactual"));
					regMovimiento.setMontomovimiento(rs.getDouble("montomovimiento"));
					
					movimientos.add(regMovimiento);
				}
						
							
			} catch (SQLException e) {
				System.out.println("Error al crear tablas.");
				e.printStackTrace();			
			} finally {
				handler.closeResources(st, cn);
			}
		return movimientos;
	}

	@Override
	public List<Movimientos> traerTodosLosMovimientosCuentas(int nroCuenta, int tipoOperacion, String inicio, String fin)throws DataAccessException {
		Statement st = null;
	      ResultSet rs = null;
			
			IConnectionHandler handler = new ConnectionHandler();
			Connection cn = handler.getConnection();
			
			List<Movimientos> movimientos = new ArrayList<Movimientos>();
						
			try {
				st = cn.createStatement();
				rs = st.executeQuery("SELECT * FROM movimientos Where movimientos.nrocuenta = " + nroCuenta + " and movimientos.tipomovimiento = " + tipoOperacion +"  and movimientos.fecha>= '"+ inicio +"' and movimientos.fecha<'"+ fin+"'");
				
				Movimientos regMovimiento = null;
				
				while (rs.next()) {
					
					regMovimiento = new Movimientos();
					regMovimiento.setIdmovimiento(rs.getInt("idmovimiento"));
					regMovimiento.setNrocuenta(rs.getInt("nrocuenta"));
					regMovimiento.setFecha(rs.getDate("fecha"));
					regMovimiento.setTipomovimiento(rs.getInt("tipomovimiento"));
					regMovimiento.setOrigen(rs.getInt("origen"));
					regMovimiento.setSaldoactual(rs.getDouble("saldoactual"));
					regMovimiento.setMontomovimiento(rs.getDouble("montomovimiento"));
					
					movimientos.add(regMovimiento);
				}
			} catch (SQLException e) {
				System.out.println("Error al crear tablas.");
				e.printStackTrace();			
			} finally {
				handler.closeResources(st, cn);
			}
		return movimientos;
	}

	@Override
	public List<Movimientos> traerMovimientosCuentas(int nroCuenta)throws DataAccessException {
		Statement st = null;
	      ResultSet rs = null;
			
			IConnectionHandler handler = new ConnectionHandler();
			Connection cn = handler.getConnection();
			
			List<Movimientos> movimientos = new ArrayList<Movimientos>();
									
			try {
				st = cn.createStatement();
				rs = st.executeQuery("SELECT * FROM movimientos Where movimientos.nrocuenta = " + nroCuenta + " order by movimientos.idmovimiento DESC LIMIT 5");
				
				Movimientos regMovimiento = null;
				
				while (rs.next()) {
					
					regMovimiento = new Movimientos();
					regMovimiento.setIdmovimiento(rs.getInt("idmovimiento"));
					regMovimiento.setNrocuenta(rs.getInt("nrocuenta"));
					regMovimiento.setFecha(rs.getDate("fecha"));
					regMovimiento.setTipomovimiento(rs.getInt("tipomovimiento"));
					regMovimiento.setOrigen(rs.getInt("origen"));
					regMovimiento.setSaldoactual(rs.getDouble("saldoactual"));
					regMovimiento.setMontomovimiento(rs.getDouble("montomovimiento"));
					
					movimientos.add(regMovimiento);
				}
						
							
			} catch (SQLException e) {
				System.out.println("Error al crear tablas.");
				e.printStackTrace();			
			} finally {
				handler.closeResources(st, cn);
			}
		return movimientos;
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
}